package com.itheima.consumer.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

import java.time.LocalTime;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * TODO
 *
 * @Author mr.lcc
 * @Data 2025/6/21 10:28
 */
@Slf4j
@Component
public class ConsumerMessage {

    /**
     * 第一种模式：简单消费者
     *
     * @param msg
     */
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueueMessage(String msg) {
        log.info("消费者消费到消息：{}", msg);
    }

    /**
     * 第二种模式：让多个消费者绑定到一个队列，共同消费队列中的消息。
     * 消费者1
     *
     * @param msg
     */
    @RabbitListener(queues = "work.queue")
    public void listen01(String msg) throws InterruptedException {
        log.info("消费者2........接收到消息：【" + msg + "】" + LocalTime.now());
        try {
            TimeUnit.MILLISECONDS.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 第二种模式：让多个消费者绑定到一个队列，共同消费队列中的消息。
     * 消费者2
     *
     * @param msg
     */
    @RabbitListener(queues = "work.queue")
    public void listen02(String msg) throws InterruptedException {
        log.error("消费者2........接收到消息：【" + msg + "】" + LocalTime.now());
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 第三种模式：使用交换机中的fanout模式进行消息处理。
     * 消费者1，生产消息一条两个人队列不同的处理
     *
     * @param msg
     */
    @RabbitListener(queues = "fanout.queue1")
    public void listenFanoutQueue1(String msg) {
        log.error(("消费者1接收到Fanout消息：【" + msg + "】"));
    }

    /**
     * 第三种模式：使用交换机中的fanout模式进行消息处理。
     * 消费者2，生产消息一条两个人队列不同的处理
     *
     * @param msg
     */
    @RabbitListener(queues = "fanout.queue2")
    public void listenFanoutQueue2(String msg) {
        log.info("消费者2接收到Fanout消息：{}", msg);
    }

    /**
     * 第三种模式：direct模式
     * 消费者1
     *
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "blue"}
    ))
    public void listenDirectQueue1(String msg) {
        log.info("消费者1接收到direct.queue1的消息：{}", msg);
    }

    /**
     * 第三种模式：direct模式
     * 消费者2
     *
     * @param msg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),
            key = {"red", "yellow"}
    ))
    public void listenDirectQueue2(String msg) {
        log.error("消费者2接收到direct.queue2的消息：{}", msg);
    }

    /**
     * 第四种：Topic模式
     *
     * @param msg
     */
    @RabbitListener(queues = "topic.queue1")
    public void listenTopicQueue1(String msg) {
        System.out.println("消费者1接收到topic.queue1的消息：【" + msg + "】");
    }

    /**
     * 第四种：Topic模式
     *
     * @param msg
     */
    @RabbitListener(queues = "topic.queue2")
    public void listenTopicQueue2(String msg) {
        System.out.println("消费者2接收到topic.queue2的消息：【" + msg + "】");
    }

    /**
     * JSON序列化数据消费数据
     */
    @RabbitListener(queues = "object.queue")
    public void listerSimpleQueueMessage(Map<String, Object> msg) {
        log.info("消费者接收到object.queue消息：【" + msg + "】");
    }

    //掌握注解方式
    @RabbitListener(queuesToDeclare = @Queue(
            name = "lazy.queue",
            durable = "true",
            arguments = @Argument(name = "x-queue-mode", value = "lazy")
    ))
    public void listenLazyQueue(String msg) {
        log.info("接收到 lazy.queue的消息：{}", msg);
    }

    /**
     * 消费本地磁盘写入的数据
     *
     * @param msg
     */
    @RabbitListener(queues = "lazy.queue")
    public void listerLazyDate(String msg) {
        log.info("消费Lazy存储的磁盘信息,{}", msg);
    }

    /**
     * 消息
     * @param msg
     */
    @RabbitListener(queuesToDeclare = @Queue(name = "priority.queue",
            durable = "true",
            arguments = @Argument(name = "x-max-priority", value = "10", type = "java.lang.Integer")
    ))
    public void priorityMsg(String msg) {
        log.info("优先级队列消息：{}", msg);
    }

}
